package com.ctb.dao;

import java.io.IOException;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.MissingResourceException;

import org.apache.log4j.Logger;

import oracle.jdbc.OracleTypes;
import utiles.AppProperties;
import utiles.ConexionPool;


import com.dte.dto.GuiaDatosEnvDTE;
import com.dte.dto.GuiaDespRptaDTE;
import com.dte.vo.DetalleVO;
import com.dte.vo.EmisorVO;
import com.dte.vo.EncabezadoVO;
import com.dte.vo.ObservacionVO;
import com.dte.vo.ReceptorVO;
import com.dte.vo.TotalesVO;
import com.dte.vo.TransporteVO;
import com.far.dto.DocumentoDetalleDTO;
import com.liquid_technologies.ltxmllib8.exceptions.LtException;

public class FacturaEnviarDAO {
	private static Logger log = Logger.getLogger(FacturaEnviarDAO.class);
	String pkgVar = (AppProperties.getProperty("aplicacion", "PACKAGE"));

	
	public int envioFactura(String idDocumento) throws MissingResourceException, IOException, SQLException{
		int resultado = 6;
		Connection conn = ConexionPool.getConnectionPool();	
		
		GuiaDatosEnvDTE guiaDatosEnvDTE = new GuiaDatosEnvDTE();
		List<GuiaDatosEnvDTE> listRetorno = new ArrayList<GuiaDatosEnvDTE>();
		try {
			
			String query = "{ call "+pkgVar+".PKG_FAR_GUIA_DESPACHO.getAllDatosGuiaByIDDoc(?,?,?) }"; 	       
			CallableStatement  stmt = conn.prepareCall(query);			
			stmt.setString(1, idDocumento);	
			stmt.setString(2, "FCI");			
			stmt.registerOutParameter(3, OracleTypes.CURSOR);
			stmt.execute();
			ResultSet rs = (ResultSet)stmt.getObject(3);
			while (rs.next()) {				
				guiaDatosEnvDTE.setFechaEmision(rs.getString(1));
				guiaDatosEnvDTE.setFechaVencimiento(rs.getString(2)); 
				guiaDatosEnvDTE.setRutEmisor(rs.getString(3)); 
				guiaDatosEnvDTE.setRazonSocialEmisor(rs.getString(4)); 
				guiaDatosEnvDTE.setGiroEmisor(rs.getString(5));
				guiaDatosEnvDTE.setActecoEmisor(rs.getString(6));
				guiaDatosEnvDTE.setTelefonoEmisor(rs.getString(7));
				guiaDatosEnvDTE.setDireccionEmisor(rs.getString(8));
				guiaDatosEnvDTE.setComunaEmisor(rs.getString(9));
				guiaDatosEnvDTE.setCiudadEmisor(rs.getString(10));
				guiaDatosEnvDTE.setRutCliente(rs.getString(11));
				guiaDatosEnvDTE.setRazonSocialCliente(rs.getString(12));
				guiaDatosEnvDTE.setGiroCliente(rs.getString(13));
				guiaDatosEnvDTE.setContactoEmpresaCliente(rs.getString(14));
				guiaDatosEnvDTE.setEmailCliente(rs.getString(15));
				guiaDatosEnvDTE.setDireccionCliente(rs.getString(16));
				guiaDatosEnvDTE.setComunaCliente(rs.getString(17));
				guiaDatosEnvDTE.setComunaPostalCliente(rs.getString(18));
				guiaDatosEnvDTE.setCiudadCliente(rs.getString(19));
				guiaDatosEnvDTE.setNetoTotal(rs.getString(20));
				guiaDatosEnvDTE.setPorcentajeIVA(rs.getString(21));
				guiaDatosEnvDTE.setIva(rs.getString(22));
				guiaDatosEnvDTE.setTotal(rs.getString(23));						
				listRetorno.add(guiaDatosEnvDTE);				
				
			}
			rs.close();
			stmt.close();
		} catch (SQLException ex) {  
			log.error("Error FacturaEnviarDAO.envioFactura SQLException: " +ex.getMessage());
			System.out.println(ex.getMessage());
			resultado = 6;
		} 
		
		//return listRetorno;
		
		
		List<DocumentoDetalleDTO> listRetornoDet = new ArrayList<DocumentoDetalleDTO>();
		try {
			String query = "{ call "+pkgVar+".PKG_FAR_GUIA_DESPACHO.getDetDocumentosByIDDoc(?,?,?) }"; 	       
			CallableStatement  stmt = conn.prepareCall(query);			
			stmt.setString(1, idDocumento);	
			stmt.setString(2, "FCI");
			stmt.registerOutParameter(3, OracleTypes.CURSOR);
			stmt.execute();
			ResultSet rs = (ResultSet)stmt.getObject(3);
			while (rs.next()) {
				DocumentoDetalleDTO documDetDTO = new DocumentoDetalleDTO();
				documDetDTO.setIdDocumentoDetalle(rs.getString(1));
				documDetDTO.setIdDocumento(rs.getString(2)); 
				documDetDTO.setKinf(rs.getString(3)); 
				documDetDTO.setPresentacion(rs.getString(4)); 
				documDetDTO.setCantidad(rs.getString(5));
				documDetDTO.setPrecioListaNeto(rs.getString(6));
				documDetDTO.setPercenGratuidad(rs.getString(7));
				documDetDTO.setTotalNeto(rs.getString(8));
				documDetDTO.setDescripcion(rs.getString(9));
				//documDetDTO.setNetoListaTotal(rs.getString(10));
				//documDetDTO.setPercenGratuidadTotal(rs.getString(11));
				//documDetDTO.setNetoTotal(rs.getString(12));
				listRetornoDet.add(documDetDTO);				
				
			}
			rs.close();
			stmt.close();
		} catch (SQLException ex) {  
			log.error("Error FacturaEnviarDAO.envioFactura SQLException: " +ex.getMessage());
			System.out.println(ex.getMessage());
		} finally {			
			conn.close();
			conn = null;
		}
			
		
		
		
	    //System.out.println("registro de encabezados > 0 si hay"+listRetorno.size());
		
	   if (listRetorno.size() > 0){
		   //System.out.println("2:");
			//Encabezado
			//GuiaDespachoDAO envia = new GuiaDespachoDAO();
			EncabezadoVO encabezadoVO = new EncabezadoVO();
			encabezadoVO.setFechaEmis(guiaDatosEnvDTE.getFechaEmision());
			encabezadoVO.setFechaVenc(guiaDatosEnvDTE.getFechaVencimiento());
			encabezadoVO.setFolio(idDocumento);
			//Receptor
			ReceptorVO receptorVO = new ReceptorVO();
			receptorVO.setRutReceptor(guiaDatosEnvDTE.getRutCliente());
			receptorVO.setRazonSocialReceptor(guiaDatosEnvDTE.getRazonSocialCliente());
			receptorVO.setContactoReceptor(guiaDatosEnvDTE.getContactoEmpresaCliente());
			receptorVO.setCorreoReceptor(guiaDatosEnvDTE.getEmailCliente());
			receptorVO.setDireccionReceptor(guiaDatosEnvDTE.getDireccionCliente());
			receptorVO.setGiroReceptor(guiaDatosEnvDTE.getGiroCliente());
			receptorVO.setComunaReceptor(guiaDatosEnvDTE.getComunaCliente());		
			receptorVO.setCiudadReceptor(guiaDatosEnvDTE.getCiudadCliente());
			receptorVO.setCmnaPostalReceptor(guiaDatosEnvDTE.getComunaPostalCliente());
		    // Transporte
			TransporteVO tranporteVO = new TransporteVO();
			tranporteVO.setDireccionDestino("Alameda 999 Oficina 601");
			tranporteVO.setComunaDestino("Santiago");
			tranporteVO.setCuidadDestino("Santiago");
			// Emisor
			//Documento/Encabezado/Emisor
			EmisorVO emisorVo = new EmisorVO();
			emisorVo.setRutEmisor(guiaDatosEnvDTE.getRutEmisor());
			emisorVo.setRazonsocialEmisor(guiaDatosEnvDTE.getRazonSocialEmisor());
			emisorVo.setGiroEmisor(guiaDatosEnvDTE.getGiroEmisor());
			emisorVo.setActeco(guiaDatosEnvDTE.getActecoEmisor());
			emisorVo.setTelefonoEmisor(guiaDatosEnvDTE.getTelefonoEmisor());
			emisorVo.setDireccionEmisor(guiaDatosEnvDTE.getDireccionEmisor());
			emisorVo.setComunaEmisor(guiaDatosEnvDTE.getComunaEmisor());
			emisorVo.setCiudadEmisor(guiaDatosEnvDTE.getCiudadEmisor());
			
			//Totales
			TotalesVO totalesVO = new TotalesVO();
			totalesVO.setTasaIva(guiaDatosEnvDTE.getPorcentajeIVA());
			totalesVO.setIva(guiaDatosEnvDTE.getIva());
			totalesVO.setMontoTotal(guiaDatosEnvDTE.getTotal());
			totalesVO.setMontoNeto(guiaDatosEnvDTE.getNetoTotal());
			
			//observacion		
			ObservacionVO observacionVO = new ObservacionVO();
			observacionVO.setNombre("envio a traves de Java");
			observacionVO.setTexto("estas son las observaciones Liga automaticas");		
	
			
			List detalleList = new ArrayList();
			if (listRetornoDet.size() > 0){					
					for (int i = 0; i < listRetornoDet.size(); i++){
						DocumentoDetalleDTO  docDetalleVO = (DocumentoDetalleDTO) listRetornoDet.get(i);	
						DetalleVO  detalleVO = new DetalleVO(); 
						detalleVO.setTipoCodigo("INT");
						detalleVO.setValorCodigo(docDetalleVO.getKinf());
						
						detalleVO.setNroLinea(String.valueOf(i));
						detalleVO.setItem(docDetalleVO.getDescripcion());
						detalleVO.setMontoItem(docDetalleVO.getTotalNeto());
						detalleVO.setQtyItem(docDetalleVO.getCantidad());
						detalleVO.setPrecioItem(docDetalleVO.getPrecioListaNeto());							
						detalleList.add(detalleVO);
					}					
			}
            System.out.println("registros Seteados en detalleList:"+ detalleList.size());
			
			
			
			System.out.println("3:");
			try {
			 resultado =  FacturaEnviarDAO.enviaFactura(encabezadoVO, receptorVO, tranporteVO, totalesVO, observacionVO, emisorVo, detalleList);
			 //System.out.println("Resultado envio factura:"+resultado);
			} catch (LtException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				resultado = 6;
			}
	   }else{
		   System.out.println("no se puede asociar datos con idDocumento:"+idDocumento);
		   resultado = 6;
	   }
			
	  return resultado;
	  
	}
	
	
	
	public  List setEnviaDocSII(String idDocumento, String idEstado) throws SQLException, IOException{

		Connection conn = ConexionPool.getConnectionPool();	

		List listRetorno = new ArrayList();
		try {
			String query = "{ call "+pkgVar+".PKG_FAR_GUIA_DESPACHO.setEnviaDocSII(?,?,?) }"; 	       
			CallableStatement  stmt = conn.prepareCall(query);			
			stmt.setString(1, idDocumento);	
			stmt.setString(2, idEstado);	
			stmt.registerOutParameter(3, OracleTypes.CURSOR);
			stmt.execute();
			ResultSet rs = (ResultSet)stmt.getObject(3);
			while (rs.next()) {
				String respuesta  = rs.getString(1);				
			}
			rs.close();
			stmt.close();
		} catch (SQLException ex) {  
			log.error("Error FacturaEnviarDAO.setEnviaDocSII SQLException: " +ex.getMessage());
			System.out.println(ex.getMessage());
		} finally {			
			conn.close();
			conn = null;		
		}
		return listRetorno;
	}
	
	
	public static int enviaFactura(EncabezadoVO encabezadoVO,ReceptorVO receptorVO,	TransporteVO tranporteVO,
			TotalesVO totalesVO, ObservacionVO observacionVO, EmisorVO emisorVO, List detalleList) throws LtException{
		List listRetorno = new ArrayList();
		int control = 4;
		
		System.out.println("4:");

		//DTE
		DocumentoDTE.SiiDte.DTEDefType dte = new DocumentoDTE.SiiDte.DTEDefType();
		try {
			dte.setDTE_Choice(new DocumentoDTE.SiiDte.DTE_Choice());
		} catch (LtException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		System.out.println("5:");

		//Documento
		try {
			dte.getDTE_Choice().setDocumento(new DocumentoDTE.SiiDte.Documento());
		} catch (LtException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		DocumentoDTE.SiiDte.Documento doc = dte.getDTE_Choice().getDocumento();


		System.out.println("6:"); 
		
		//Documento/Encabezado
		try {
			doc.setEncabezado(new DocumentoDTE.SiiDte.Encabezado());
		} catch (LtException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		System.out.println("7:"); 
		//Documento/Encabezado/IdDoc
		DocumentoDTE.SiiDte.IdDoc idDoc = new DocumentoDTE.SiiDte.IdDoc();
		idDoc.setTipoDTE(DocumentoDTE.SiiDte.DTEType.n33);
		try {
			idDoc.setFolio(BigInteger.valueOf(Integer.parseInt(encabezadoVO.getFolio())));
			idDoc.setFchEmis(new com.liquid_technologies.ltxmllib8.DateTime(com.liquid_technologies.ltxmllib8.DateTimeType.date, encabezadoVO.getFechaEmis()));
			idDoc.setFmaPago(DocumentoDTE.SiiDte.IdDoc_FmaPago.n1);
			idDoc.setFchVenc(new com.liquid_technologies.ltxmllib8.DateTime(com.liquid_technologies.ltxmllib8.DateTimeType.date, encabezadoVO.getFechaEmis()));
			idDoc.setIndTraslado(DocumentoDTE.SiiDte.IdDoc_IndTraslado.n1);
			idDoc.setTipoDespacho(DocumentoDTE.SiiDte.IdDoc_TipoDespacho.n1);
			doc.getEncabezado().setIdDoc(idDoc);
		} catch (NumberFormatException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (LtException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		//Documento/Encabezado/Emisor
		DocumentoDTE.SiiDte.Emisor emisor = new DocumentoDTE.SiiDte.Emisor();
		try {
			emisor.setRUTEmisor(emisorVO.getRutEmisor());
			emisor.setRznSoc(emisorVO.getRazonsocialEmisor());
			emisor.setGiroEmis(emisorVO.getGiroEmisor());
			emisor.getActeco().add(BigInteger.valueOf(Integer.parseInt(emisorVO.getActeco())));
			emisor.getTelefono().add(emisorVO.getTelefonoEmisor());
			emisor.setDirOrigen(emisorVO.getDireccionEmisor());
			emisor.setCmnaOrigen(emisorVO.getComunaEmisor());
			emisor.setCiudadOrigen(emisorVO.getCiudadEmuisor());
			doc.getEncabezado().setEmisor(emisor);
		} catch (LtException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		System.out.println("9:");

		//Documento/Encabezado/Receptor
		DocumentoDTE.SiiDte.Receptor receptor = new DocumentoDTE.SiiDte.Receptor();
		try {
			receptor.setRUTRecep(receptorVO.getRutReceptor());
			receptor.setRznSocRecep(receptorVO.getRazonSocialReceptor());
			receptor.setGiroRecep(receptorVO.getGiroReceptor());
			receptor.setContacto(receptorVO.getContactoReceptor());
			receptor.setCorreoRecep(receptorVO.getCorreoReceptor());
			receptor.setDirRecep(receptorVO.getDireccionReceptor());
			receptor.setCmnaRecep(receptorVO.getComunaReceptor());
			receptor.setCiudadRecep(receptorVO.getCiudadReceptor());
			receptor.setCmnaPostal(receptorVO.getComunaReceptor());
			doc.getEncabezado().setReceptor(receptor);
		} catch (LtException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		//Documento/Encabezado/Transporte
		// Es opcional, en caso que el despacho vaya a otra direcci�n distinta al receptor
		DocumentoDTE.SiiDte.Transporte transporte = new DocumentoDTE.SiiDte.Transporte();
		try {
			transporte.setDirDest(tranporteVO.getDireccionDestino());
			transporte.setCmnaDest(tranporteVO.getComunaDestino());
			transporte.setCiudadDest(tranporteVO.getCuidadDestino());
			doc.getEncabezado().setTransporte(transporte);
		} catch (LtException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		System.out.println("10:");

		//Documento/Encabezado/Totales
		DocumentoDTE.SiiDte.Totales totales = new DocumentoDTE.SiiDte.Totales();
		try {
			totales.setMntNeto(BigInteger.valueOf(Integer.parseInt(totalesVO.getMontoNeto())));
			totales.setTasaIVA(BigDecimal.valueOf(Integer.parseInt(totalesVO.getTasaIva())));
			totales.setIVA(BigInteger.valueOf(Integer.parseInt(totalesVO.getIva())));
			totales.setMntTotal(BigInteger.valueOf(Integer.parseInt(totalesVO.getMontoTotal())));
			doc.getEncabezado().setTotales(totales);
		} catch (NumberFormatException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (LtException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		//Documento/Detalle
		//List detalleList
		if (detalleList.size() > 0){
			System.out.println("12:");
			DocumentoDTE.SiiDte.Detalle det = new DocumentoDTE.SiiDte.Detalle();
			DocumentoDTE.SiiDte.CdgItem cdgItem = new DocumentoDTE.SiiDte.CdgItem();
			for (int i = 0; i < detalleList.size(); i++){
				/*DetalleVO  detalleVO = (DetalleVO) detalleList.get(i);		 
				det = new DocumentoDTE.SiiDte.Detalle();
				det.setNroLinDet(BigInteger.valueOf(i+1));
				det.setNmbItem(detalleVO.getItem());
				det.setMontoItem(BigInteger.valueOf(Integer.parseInt(detalleVO.getMontoItem())));
				det.setQtyItem(BigDecimal.valueOf(Integer.parseInt(detalleVO.getQtyItem())));
				det.setPrcItem(BigDecimal.valueOf(Integer.parseInt(detalleVO.getPrecioItem())));		        
				//Documento/Detalle/CdgItem		
				cdgItem = new DocumentoDTE.SiiDte.CdgItem();
				cdgItem.setTpoCodigo(detalleVO.getTipoCodigo());
				cdgItem.setVlrCodigo(detalleVO.getValorCodigo());
				det.getCdgItem().add(cdgItem);
				doc.getDetalle().add(det);  			*/	
				 //Documento/Detalle
		        det.setNroLinDet(BigInteger.valueOf(1));
		        det.setNmbItem("Item Ejemplo");
		        det.setMontoItem(BigInteger.valueOf(1000));
		        det.setQtyItem(BigDecimal.valueOf(1));
		        det.setPrcItem(BigDecimal.valueOf(1000));		        
		        //Documento/Detalle/CdgItem
		        cdgItem.setTpoCodigo("INT");
		        cdgItem.setVlrCodigo("001");
		        det.getCdgItem().add(cdgItem);
		        doc.getDetalle().add(det);				
			}
		}else{
			System.out.println("error no hay detalles");
		} 	

		//Personalizados
		DocumentoDTE.SiiDte.PersonalizadosA personalizados = new DocumentoDTE.SiiDte.PersonalizadosA();
		try {
			dte.setPersonalizados(personalizados);
			personalizados.setDocPersonalizado(new DocumentoDTE.SiiDte.DocPersonalizadoA());
			DocumentoDTE.SiiDte.CampoStringA campoString = new DocumentoDTE.SiiDte.CampoStringA();
			campoString.setName(observacionVO.getNombre());
			campoString.setText(observacionVO.getTexto());
			personalizados.getDocPersonalizado().getCampoString().add(campoString);
		} catch (LtException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		System.out.println("13:");


		// Llamada al servicio
		String ambiente = dteboxcliente.Ambiente.Homologacion;
		String fechaResolucion = "2014-05-08";
		int numeroResolucion = 0;
		int tipoPdf417 = dteboxcliente.TipoPDF417.Fuente;
		// Local la IP debe ser 10.10.10.10
		String apiURL = "http://10.10.10.10/api/Core.svc/Core";
		//String apiURL = "http://25.120.85.185/api/Core.svc/Core";
		// DTEBox liche
		String apiAuth = "6dd62425-c356-41bb-948c-526a85d92b16";
		System.out.println("14");
		dteboxcliente.Servicio servicio = new dteboxcliente.Servicio(apiURL, apiAuth);
		System.out.println("15");
		dteboxcliente.ResultadoEnvioDocumento resultado = servicio.EnviarDocumento(dte, ambiente, fechaResolucion, numeroResolucion, tipoPdf417);
		if (resultado.getResultadoServicio().getEstado() == 0){            
			System.out.println("16");
			String ted    = resultado.getTED();
			String pdf417 = resultado.getPDF417();             
			String folio = "";
			try {
				folio = String.valueOf(idDoc.getFolio().intValue());
			} catch (LtException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			System.out.println("Folio Factura Enviada al SII por visar: " + idDoc.getFolio().intValue()); 
			GuiaDespRptaDTE rptaDte = new GuiaDespRptaDTE();
			rptaDte.setTed(ted);
			rptaDte.setFolio(folio);
			rptaDte.setPdf(pdf417);
			listRetorno.add(rptaDte);
			control = 3;

		}else{
			String error = resultado.getResultadoServicio().getDescripcion();
			System.out.println("control dteBox Liga:"+error);
			System.out.println("estado:"+resultado.getResultadoServicio().getEstado());
			System.out.println(resultado.getResultadoServicio().getExcepcionOriginal());
			int estado = resultado.getResultadoServicio().getEstado();
			if (estado == 1){
				control = 5;
			}else{
				control = 4;
			}
		}
		return control;	
	}
		

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		FacturaEnviarDAO env = new FacturaEnviarDAO();
		try {
			env.enviaFacturaTest();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	public void enviaFacturaTest() throws Exception{		
		//DTE
		DocumentoDTE.SiiDte.DTEDefType dte = new DocumentoDTE.SiiDte.DTEDefType();
		dte.setDTE_Choice(new DocumentoDTE.SiiDte.DTE_Choice());

		//Documento
		dte.getDTE_Choice().setDocumento(new DocumentoDTE.SiiDte.Documento());
		DocumentoDTE.SiiDte.Documento doc = dte.getDTE_Choice().getDocumento();

		//Documento/Encabezado
		doc.setEncabezado(new DocumentoDTE.SiiDte.Encabezado());

		//Documento/Encabezado/IdDoc
		DocumentoDTE.SiiDte.IdDoc idDoc = new DocumentoDTE.SiiDte.IdDoc();
		idDoc.setTipoDTE(DocumentoDTE.SiiDte.DTEType.n33);
		idDoc.setFolio(BigInteger.valueOf(7));
		idDoc.setFchEmis(new com.liquid_technologies.ltxmllib8.DateTime(com.liquid_technologies.ltxmllib8.DateTimeType.date, "2014-05-23"));
		idDoc.setFmaPago(DocumentoDTE.SiiDte.IdDoc_FmaPago.n1);
		idDoc.setFchVenc(new com.liquid_technologies.ltxmllib8.DateTime(com.liquid_technologies.ltxmllib8.DateTimeType.date, "2014-05-23"));
		doc.getEncabezado().setIdDoc(idDoc);

		//Documento/Encabezado/Emisor
		DocumentoDTE.SiiDte.Emisor emisor = new DocumentoDTE.SiiDte.Emisor();
		emisor.setRUTEmisor("70335000-3");
		emisor.setRznSoc("Liga Chilena Contra la Epilepsia");
		emisor.setGiroEmis("INSTITUCION DE BENEFICIENCIA- VENTA DE MEDICAMENTOS");
		emisor.getActeco().add(BigInteger.valueOf(521900));
		emisor.getTelefono().add("123-1234-12345");
		emisor.setDirOrigen("PATRIOTAS URUGUAYOS 2236");
		emisor.setCmnaOrigen("Santiago");
		emisor.setCiudadOrigen("Santiago");
		doc.getEncabezado().setEmisor(emisor);

		//Documento/Encabezado/Receptor
		DocumentoDTE.SiiDte.Receptor receptor = new DocumentoDTE.SiiDte.Receptor();
		receptor.setRUTRecep("76833240-1");
		receptor.setRznSocRecep("ebsys factory");
		receptor.setGiroRecep("Desarrollo");
		receptor.setContacto("Contacto");
		receptor.setCorreoRecep("ebarrios@ebsys.cl");
		receptor.setDirRecep("Salar Surire 1274");
		receptor.setCmnaRecep("Pudahuel");
		receptor.setCiudadRecep("Santiago");
		receptor.setCmnaPostal("Santiago");
		doc.getEncabezado().setReceptor(receptor);

		//Documento/Encabezado/Transporte
		DocumentoDTE.SiiDte.Transporte transporte = new DocumentoDTE.SiiDte.Transporte();
		transporte.setDirDest("Alameda 580 Oficina 601");
		transporte.setCmnaDest("Santiago");
		transporte.setCiudadDest("Santiago");
		doc.getEncabezado().setTransporte(transporte);

		//Documento/Encabezado/Totales
		DocumentoDTE.SiiDte.Totales totales = new DocumentoDTE.SiiDte.Totales();
		totales.setMntNeto(BigInteger.valueOf(2000));
		totales.setTasaIVA(BigDecimal.valueOf(19));
		totales.setIVA(BigInteger.valueOf(380));
		totales.setMntTotal(BigInteger.valueOf(2380));
		doc.getEncabezado().setTotales(totales);

		//Documento/Detalle
		DocumentoDTE.SiiDte.Detalle det = new DocumentoDTE.SiiDte.Detalle();
		det.setNroLinDet(BigInteger.valueOf(1));
		det.setNmbItem("Item Ejemplo");
		det.setMontoItem(BigInteger.valueOf(1000));
		det.setQtyItem(BigDecimal.valueOf(1));
		det.setPrcItem(BigDecimal.valueOf(1000));

		//Documento/Detalle/CdgItem
		DocumentoDTE.SiiDte.CdgItem cdgItem = new DocumentoDTE.SiiDte.CdgItem();
		cdgItem.setTpoCodigo("INT");
		cdgItem.setVlrCodigo("001");
		det.getCdgItem().add(cdgItem);

		doc.getDetalle().add(det);     

		//Documento/Detalle 2
		det = new DocumentoDTE.SiiDte.Detalle();
		det.setNroLinDet(BigInteger.valueOf(2));
		det.setNmbItem("Item Ejemplo 2");
		det.setMontoItem(BigInteger.valueOf(1000));
		det.setQtyItem(BigDecimal.valueOf(1));
		det.setPrcItem(BigDecimal.valueOf(1000));

		//Documento/Detalle/CdgItem
		cdgItem = new DocumentoDTE.SiiDte.CdgItem();
		cdgItem.setTpoCodigo("INT");
		cdgItem.setVlrCodigo("002");
		det.getCdgItem().add(cdgItem);

		doc.getDetalle().add(det);     


		//Personalizados
		DocumentoDTE.SiiDte.PersonalizadosA personalizados = new DocumentoDTE.SiiDte.PersonalizadosA();
		dte.setPersonalizados(personalizados);

		personalizados.setDocPersonalizado(new DocumentoDTE.SiiDte.DocPersonalizadoA());

		DocumentoDTE.SiiDte.CampoStringA campoString = new DocumentoDTE.SiiDte.CampoStringA();
		campoString.setName("Observaciones");
		campoString.setText("Estas son las observaciones");
		personalizados.getDocPersonalizado().getCampoString().add(campoString);


		// Llamada al servicio
		String ambiente = dteboxcliente.Ambiente.Homologacion;
		String fechaResolucion = "2014-05-08";
		int numeroResolucion = 0;
		int tipoPdf417 = dteboxcliente.TipoPDF417.Fuente;
		// Local la IP debe ser 10.10.10.10
		String apiURL = "http://10.10.10.10/api/Core.svc/Core";
		//String apiURL = "http://25.120.85.185/api/Core.svc/Core";
		// DTEBox liche
		String apiAuth = "6dd62425-c356-41bb-948c-526a85d92b16";
		//        System.out.println("Creando el servicio");
		dteboxcliente.Servicio servicio = new dteboxcliente.Servicio(apiURL, apiAuth);
		//        System.out.println("Llamando el servicio");


		dteboxcliente.ResultadoEnvioDocumento resultado = servicio.EnviarDocumento(dte, ambiente, fechaResolucion, numeroResolucion, tipoPdf417);
		System.out.println("Llamado");
		System.out.println(dte.toXml());
		//        Procesar resultado
		if (resultado.getResultadoServicio().getEstado() == 0){

			System.out.println("ok");
			String ted = resultado.getTED();
			String pdf417 = resultado.getPDF417();

			System.out.println("Folio: " + idDoc.getFolio().intValue());

		}else{

			String error = resultado.getResultadoServicio().getDescripcion();
			System.out.println(error);
			System.out.println(resultado.getResultadoServicio().getExcepcionOriginal());

		}
        
    }

}
